package com.example.excel.controller;

import com.example.excel.service.ExcelExportService;
import com.example.excel.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

/**
 * Excel导出控制器
 * 提供生成测试数据和导出Excel文件的REST API接口
 * 
 * 主要功能：
 * 1. 生成指定数量的测试数据
 * 2. 使用SXSSF方式导出Excel文件（推荐，适用于大数据量）
 * 3. 使用XSSF方式导出Excel文件（仅适用于小数据量）
 */
@RestController
@RequestMapping("/api/excel")
public class ExcelExportController {
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private ExcelExportService excelExportService;
    
    /**
     * 生成指定数量的测试数据
     * 
     * 该接口用于生成指定数量的用户测试数据并保存到数据库中
     * 主要用于测试Excel导出功能的数据准备
     * 
     * @param count 数据量，默认1000000（一百万条）
     * @return 生成结果，包含生成的数据量和耗时信息
     */
    @PostMapping("/generate-data")
    public ResponseEntity<String> generateTestData(@RequestParam(defaultValue = "1000000") int count) {
        try {
            long startTime = System.currentTimeMillis();
            int generatedCount = userService.generateUsers(count);
            long endTime = System.currentTimeMillis();
            
            String result = String.format(
                "成功生成 %d 条测试数据，耗时: %d ms", 
                generatedCount, 
                (endTime - startTime)
            );
            
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("生成测试数据失败: " + e.getMessage());
        }
    }
    
    /**
     * 使用SXSSF方式导出Excel文件
     * 
     * SXSSF（Streaming Usermodel API for XML spreadsheets）特点：
     * 1. 内存效率高，适用于大数据量导出
     * 2. 只在内存中保留有限行数的数据
     * 3. 超出行数限制的数据会写入磁盘临时文件
     * 
     * @return Excel文件下载响应
     */
    @GetMapping("/export-sxssf")
    public ResponseEntity<byte[]> exportWithSXSSF() {
        try {
            String fileName = "users_sxssf.xlsx";
            // 使用系统临时目录存储导出文件
            String filePath = System.getProperty("java.io.tmpdir") + File.separator + fileName;
            
            // 使用SXSSF方式导出，内存中保留100行数据
            long exportedCount = excelExportService.exportWithSXSSF(filePath, 100);
            
            // 读取文件并返回给前端
            File file = new File(filePath);
            byte[] bytes = Files.readAllBytes(file.toPath());
            
            // 删除临时文件，释放磁盘空间
            file.delete();
            
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", fileName);
            headers.setContentLength(bytes.length);
            
            return ResponseEntity.ok()
                .headers(headers)
                .body(bytes);
                
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(("导出SXSSF文件失败: " + e.getMessage()).getBytes());
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(("导出SXSSF文件失败: " + e.getMessage()).getBytes());
        }
    }
    
    /**
     * 使用XSSF方式导出Excel文件（注意：大数据量可能导致内存溢出）
     * 
     * XSSF（Usermodel API for XML spreadsheets）特点：
     * 1. 功能完整，支持所有Excel特性
     * 2. 所有数据都在内存中处理
     * 3. 大数据量时容易导致内存溢出
     * 4. 适用于小数据量导出
     * 
     * @return Excel文件下载响应
     */
    @GetMapping("/export-xssf")
    public ResponseEntity<byte[]> exportWithXSSF() {
        try {
            String fileName = "users_xssf.xlsx";
            // 使用系统临时目录存储导出文件
            String filePath = System.getProperty("java.io.tmpdir") + File.separator + fileName;
            
            // 使用XSSF方式导出（注意：大数据量可能导致内存溢出）
            long exportedCount = excelExportService.exportWithXSSF(filePath);
            
            // 读取文件并返回给前端
            File file = new File(filePath);
            byte[] bytes = Files.readAllBytes(file.toPath());
            
            // 删除临时文件，释放磁盘空间
            file.delete();
            
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", fileName);
            headers.setContentLength(bytes.length);
            
            return ResponseEntity.ok()
                .headers(headers)
                .body(bytes);
                
        } catch (OutOfMemoryError e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(("导出XSSF文件失败，内存不足: " + e.getMessage()).getBytes());
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(("导出XSSF文件失败: " + e.getMessage()).getBytes());
        }
    }
}